#ifndef _VIDEO_GRAPHICS_H_
#define _VIDEO_GRAPHICS_H_

#include <dpmi.h>
#include <go32.h>
#ifndef EMBED
	#include <stdlib.h>
#endif
#include <sys/nearptr.h>
#include <math.h>
#include <string.h>

/** @defgroup Videog Videog
 * @{
 *
 * @brief Biblioteca de manipulação da Placa Gráfica.
 */

// Cores
#define BLACK 0x00
#define BRIGHT 0x08
#define RED 0x04
#define GREEN 0x02
#define BLUE 0x01
#define WHITE 0x07

#define TOP_BORDER 18

#define CHAR_HEIGHT 16
#define CHAR_WIDTH 8

#define set_pixel(x, y, color, base) ( *((base) + (y)*HRES + (x)) = (color) )

/** Variável global com quantidade de linhas horizontais. */
extern int HRES;
/** Variável global com quantidade de linhas verticais. */
extern int VRES;  /**< global variable with the vertical resolution in pixels */
#define CHR_H 16 // character height
extern char* video_mem;
extern char* image_buffer;
extern char* image_buffer_original;

// Funções

/** Entra no modo gráfico. Define VRES e HRES. Devolve um apontador para a memória gráfica ou NULL em caso de erro. */
char * enter_graphics(int mode, __dpmi_meminfo *map);

/** Sai do modo gráfico. */
void leave_graphics(__dpmi_meminfo *map);

/** Pinta um pixel na posição (x,y) com a cor definida. */
void set_large_pixel(int x, int y, int color, char *base);

/** Obtem a cor de um pixel na posição (x,y). */
int get_pixel(int x, int y, char *base);

/** Preenche o ecrã com uma cor escolhida. */
void clear_screen(char color, char *base);

/** Limpa a área de jogo do ecrã. */
void clear_game_screen(char color, char *base);

/** Limpa todo o ecra. */
void reset_screen(char color, char *base);

/** Desenha uma linha entre os pontos (xi,yi) e (xf,yf) com uma cor especificada. */
void draw_line(int xi, int yi, int xf, int yf, int color, char *base);

 /** Desenha um rectângulo com vértices (x1,y1),(x2,y1),(x2,y2),(x1,y2) com a cor especificada. */
void draw_rect(int x1, int y1, int x2, int y2, int color, char *base);

/** Imprimir um caracter na posiçaõ (X,Y) com uma cor de letra e fundo. */
void drawCharAt(char c, int x, int y, int fore_color, int back_color, int char_scale, char *table, char* base);

/** Copia o buffer de imagem "buffer" para o endereço de memória "base". */
void swap_buffers(char* buffer, char* base);

/** Troca os buffers de imagem com o da memória "base". */
void swap_game_buffers(char* buffer, char* base);
/** @} end of video */ 

#endif
